home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekikoh Dennoh Club 5
/
Gekikoh Dennoh Club Vol. 5 (Japan).7z
/
Gekikoh Dennoh Club Vol. 5 (Japan) (Track 01).bin
/
internet
/
webx
/
webcm011.lzh
/
WebCM.c
< prev
next >
Wrap
C/C++ Source or Header
|
1998-09-27
|
8KB
|
321 lines
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
#include <sys/stat.h>
#include <sys/xglob.h>
#include "WebCM.h"
#include "WebCache/WebCache.h"
#include "FuncUrl/FuncUrl.h"
/* ÆnêµÄ₧è╘é╔é╖éΘé╜é▀é╔ë┴ÄZé╖éΘÆl */
#define TO_LOCALTIME 32400
extern unsigned int cache_sum; /* î╗ì▌âLâââbâVâàé╡é─éóéΘâtâ@âCâïÉö */
extern unsigned int abs_max; /* Cxxxxxxx é╠ì┼æσÆl */
extern unsigned int abs_min; /* Cxxxxxxx é╠ì┼żÆl */
extern char cachedir[256]; /* è┬ï½ò╧Éö WEBCACHE */
extern char cache_changed; /* âLâââbâVâàé╠ôαùeé≡éPë±é┼éαò╧ìXé╡é╜é⌐üH */
/* URL é╞âeâôâ|âëâèâtâ@âCâïû╝é╠æ╬ë₧âeü[âuâï */
typedef struct _temptable {
struct _temptable *next;/* ò╨ò√îⁿâèâXâg */
char hash; /* ânâbâVâàÆl */
char type; /* Content-Type */
unsigned int number; /* âeâôâ|âëâèâtâ@âCâïû╝üié╠ÉöÆlòöüj */
unsigned int length; /* âtâ@âCâïâTâCâY */
short year; /* 0...32767 */
char mon; /* 1...12 */
char day; /* 1...31 */
char hour; /* 0...23 */
char min; /* 0...59 */
char sec; /* 0...59 */
char access; /* âAâNâZâXâtâëâO */
char url[0]; /* urlüiGCC é╔ê╦æ╢é╡é╜ò\ïLé┼éáéΘé▒é╞é╔Æìê╙üj */
} TEMPTABLE;
static char *ext_type_str[]=
{"HTM", "TXT", "DOC",
"GIF", "JPG", "PNG", "BMP",
"ZIP", "LZH", "TGZ",
"PDF",
"DAT", "DAT"};
char destdir[256];
unsigned int start_no = -1;
unsigned int end_no = -1;
int copy_flag = 0;
int del_flag = 0;
int justify_flag = 0;
int renum_flag = 0;
int renum = 0;
extern TEMPTABLE *tt_top;
void usage (void)
{
printf ("WebCacheManager WebCM.X ver0.11\n"
" programmed by Mitsuky < FreeSoftware >\n"
"WebCache âtâ@âCâï(Cxxxxxxx.xxx)é╔æ╬é╡é─èeÄφæÇì∞é≡ìséóé▄é╖\n"
"Ägùpû@ : WebCM [option] [âfâBâîâNâgâèû╝]\n"
"[option]\n"
"-C[èJÄnâtâ@âCâïö╘ìå][,ÅIù╣âtâ@âCâïö╘ìå]\n"
" WebCache âtâ@âCâïé≡î│é╠âtâ@âCâïû╝é╔ò£î│é╡é─âRâsü[é╡é▄é╖üB\n"
"-M[èJÄnâtâ@âCâïö╘ìå][,ÅIù╣âtâ@âCâïö╘ìå]\n"
" WebCache âtâ@âCâïé≡î│é╠âtâ@âCâïû╝é╔ò£î│é╡é─ê┌ô«é╡é▄é╖üB\n"
"-D[èJÄnâtâ@âCâïö╘ìå][,ÅIù╣âtâ@âCâïö╘ìå]\n"
" WebCache âtâ@âCâïé≡ìφÅ£é╡é▄é╖üB"
"-J[èJÄnâtâ@âCâïö╘ìå][,ÅIù╣âtâ@âCâïö╘ìå]\n"
" WebCache âtâ@âCâïé╞ WebCache.env é╠É«ìçɽé≡é╞éΦé▄é╖üB\n"
"âfâBâîâNâgâèû╝ : -C / -M Ä₧é╠âRâsü[ɵâfâBâîâNâgâè\n"
" û│ÄwÆΦÄ₧é═âJâîâôâgâfâBâîâNâgâè\n"
" âfâBâîâNâgâèé¬û│éóÅΩìçé═Ä⌐ô«ôIé╔ì∞ɼé╡é▄é╖\n"
"è┬ï½ò╧Éö WEBCACHE é≡ÄQÅ╞é╡é▄é╖\n");
}
/* ì─ïAôIé╔âfâBâîâNâgâèé≡ì∞ɼé╖éΘ */
/* *dirname = "C:/BIN/em/complete/" é╠éµéñé╔ÄwÆΦé╖éΘé╞ */
/* êΩïCé╔éRèKæwé╠âfâBâîâNâgâèé≡ì∞éΦé▄é╖ */
/* è∙é╔âfâBâîâNâgâèé¬æ╢ì▌é╡é╜ÅΩìçé═ë╜éαé╡é▄é╣é± */
int RecursiveMkdir (char *dirname)
{
char *p;
DIR *dirp;
char temp_str[256], temp_str2[256];
_fullpath (temp_str, dirname, 256);
_addlastsep (temp_str);
_toslash (temp_str);
p = temp_str;
do {
while ((*p) && (*p++ != '/'));
strncpy (temp_str2, temp_str, p - temp_str);
*(temp_str2 + (p - temp_str)) = '\0';
if ((dirp = opendir (temp_str2)) != NULL) {
closedir (dirp);
} else {
printf ("mkdir %s\n", temp_str2);
if (mkdir (temp_str2, S_IEXEC | S_IWRITE | S_IREAD)) {
printf ("âGâëü[ : %s é¬ì∞ɼé┼é½é▄é╣é±é┼é╡é╜\n");
return (-1);
}
}
} while (*p);
return (0);
}
int ExecMain (void)
{
int cache_num = 0;
char source_fname[256], dest_fname[256];
FILE *fp;
char *content = NULL;
char scheme[256], hostname[256], path[256], fname[256], query[256], anchor[256];
int port;
TEMPTABLE *tt = tt_top, *tt_next;
_addlastsep (destdir);
if (RecursiveMkdir (destdir) < 0) {
return (-1);
}
do {
tt_next = tt->next;
printf ("Åêù¥Æå %d/%d\x1b[0J\n\x0b", cache_num, cache_sum);
if ((tt->number >= start_no) && (tt->number <= end_no) && (!tt->access)) {
tt->access = !0;
UrlSplit (tt->url, scheme, hostname, path, fname, query, anchor, &port);
sprintf (source_fname, "%sC%07d.%s", cachedir, tt->number, ext_type_str[tt->type]);
sprintf (dest_fname, "%s%s", destdir, fname);
printf (" %s", source_fname);
if (copy_flag) {
if ((fp = fopen (dest_fname, "rb")) != NULL) {
printf (" -> %s : ô»û╝é╠âtâ@âCâïé¬æ╢ì▌é╡é▄é╖\n", dest_fname);
fclose (fp);
continue;
}
if ((fp = fopen (source_fname, "rb")) != NULL) {
if ((content = malloc (tt->length)) != NULL) {
fread (content, tt->length, sizeof (char), fp);
} else {
printf ("\n âGâëü[ : âüâéâèé¬æ½éΦé▄é╣é±\n");
content = NULL;
continue;
}
fclose (fp);
if ((fp = fopen (dest_fname, "wb")) != NULL) {
struct tm t;
struct utimbuf u;
fwrite (content, sizeof (char), tt->length, fp);
fclose (fp);
t.tm_year = tt->year - 1900;
t.tm_mon = tt->mon - 1;
t.tm_mday = tt->day;
t.tm_hour = tt->hour;
t.tm_min = tt->min;
t.tm_sec = tt->sec;
u.modtime = u.actime = mktime (&t) + TO_LOCALTIME;
utime (dest_fname, &u);
printf (" -> %s", dest_fname);
if (!del_flag)
printf (" : âRâsü[é╡é▄é╡é╜\n");
} else {
printf ("\n %s : é▒é╠âtâ@âCâïû╝é┼é═Åæé½ì₧é▀é▄é╣é±\n", dest_fname);
free (content);
continue;
}
} else {
printf (" é¬âIü[âvâôé┼é½é▄é╣é±\n", source_fname);
free (content);
continue;
}
}
if (del_flag) {
if (!remove (source_fname)) {
WCDeleteUrl (tt->url);
if (copy_flag)
printf (" : ê┌ô«é╡é▄é╡é╜\n");
else
printf (" : ìφÅ£é╡é▄é╡é╜\n");
} else {
printf (" : ìφÅ£é┼é½é▄é╣é±é┼é╡é╜\n");
}
}
if (justify_flag) {
if ((fp = fopen (source_fname, "rb")) != NULL) {
fclose (fp);
printf (" : æ╢ì▌é╡é▄é╖\n");
} else {
WCDeleteUrl (tt->url);
printf (" : WebCache.env é⌐éτìφÅ£é╡é▄é╡é╜\n");
}
}
#if 0
if (renum_flag) {
tt->number += renum;
sprintf (dest_fname, "%sC%07d.%s", cachedir, tt->number, ext_type_str[tt->type]);
if (rename (source_fname, dest_fname) == 0) {
printf (" : âèâiâôâoü[é╡é▄é╡é╜\n");
} else {
printf (" : âèâiâôâoü[é┼é½é▄é╣é±é┼é╡é╜\n");
}
}
#endif
if (content)
free (content);
}
cache_num++;
} while ((tt = tt_next) != NULL);
return (0);
}
void GetNum (char *argv)
{
switch ((char) (*(argv + 2))) {
case '\0': /* -C é╠é▌ */
start_no = -1;
end_no = -1;
break;
case ',': /* -C,ÅIù╣âtâ@âCâïö╘ìå */
start_no = -1;
sscanf (argv + 3, "%d", &end_no);
break;
default: /* -CèJÄnâtâ@âCâïö╘ìå,ÅIù╣âtâ@âCâïö╘ìå */
sscanf (argv + 2, "%d,%d", &start_no, &end_no);
break;
}
}
int main (int argc, char *argv[])
{
int i;
int slash_flag = 0;
{
char *temp;
temp = getenv ("SLASH");
if ((temp != NULL) && (*temp == '/')) {
slash_flag = 1;
}
}
strcpy (destdir, ".");
for (i = 1; i < argc; i++) {
if (('-' == *argv[i]) || ((slash_flag == 0) && ('/' == *argv[i]))) {
switch (*(argv[i] + 1)) {
case 'c':
case 'C':
copy_flag = !0;
del_flag = 0;
GetNum (argv[i]);
break;
case 'd':
case 'D':
copy_flag = 0;
del_flag = !0;
GetNum (argv[i]);
break;
case 'm':
case 'M':
copy_flag = !0;
del_flag = !0;
GetNum (argv[i]);
break;
case 'j':
case 'J':
justify_flag = !0;
GetNum (argv[i]);
break;
#if 0
case 'r':
case 'R':
renum_flag = !0;
renum = atoi (argv[i] + 2);
break;
#endif
default:
usage ();
return (-1);
}
} else {
strcpy (destdir, argv[i]);
}
}
if ((!copy_flag) && (!del_flag) && (!justify_flag) && (!renum_flag)) {
usage ();
return (-1);
}
WCInit ();
if (start_no == -1)
start_no = abs_min;
if (end_no == -1)
end_no = abs_max;
if (!cache_sum) {
printf ("âLâââbâVâàâtâ@âCâïé¬éáéΦé▄é╣é±\n");
return (0);
}
printf ("C%07d é⌐éτ C%07d é≡Åêù¥é╡é▄é╖\n", start_no, end_no);
ExecMain ();
if (renum_flag)
cache_changed = !0;
if ((del_flag) || (justify_flag) || (renum_flag))
WCTini ();
return (0);
}